package com.mixsmart.commonweb.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.mixsmart.commonweb.IWebConstant;
import com.mixsmart.commonweb.bean.entity.TCMenu;
import com.mixsmart.commonweb.bean.entity.TCRoleMenu;
import com.mixsmart.commonweb.service.IRoleMenuService;
import com.mixsmart.core.bean.MixResponse;
import com.mixsmart.core.service.IResQueryService;
import com.mixsmart.spellsql.utils.Cnd;
import com.mixsmart.spellsql.utils.Exp;
import com.mixsmart.utils.CollectionUtils;
import com.mixsmart.utils.StringUtils;

/**
 * 角色菜单--实现类（IRoleMenuService接口的实现类）
 * @version 1.0
 * @since JDK1.6以上
 * @author lmq
 * <br />
 * 2016年7月23日
 */
@Service
public class RoleMenuService extends WebMgrService<TCRoleMenu> implements IRoleMenuService {

	@Autowired
	private IResQueryService resQueryServ;
	
	@Override
	public boolean save(String roleId, List<TCMenu> menus) {
		boolean is = false;
		if(StringUtils.isNotEmpty(roleId) && CollectionUtils.isNotEmpty(menus)) {
			TCRoleMenu roleMenu = null;
			Map<String,TCRoleMenu> roleMenuMaps = new HashMap<String, TCRoleMenu>();
			for (TCMenu menu : menus) {
				roleMenu = roleMenuMaps.get(menu.getId());
				if(null == roleMenu) {
					roleMenu = new TCRoleMenu();
					roleMenu.setMenuId(menu.getId());
					roleMenu.setRoleId(roleId);
					roleMenuMaps.put(menu.getId(), roleMenu);
					boolean isLoop = true;
					
					/**
					 * 循环查找父级菜单；判断选中的菜单中是否含有父菜单；
					 * 如果没有父菜单则查找；然后加入角色菜单对应关系表中；
					 * 原因是为了避免，只选择子菜单；而不选择父菜单时；
					 * 在菜单中无法显示（或没有）父菜单。
					 */
					while(isLoop) {
						roleMenu = roleMenuMaps.get(menu.getParentId());
						if(null == roleMenu) {
							if(!isRoleMenuRelateExist(roleId,menu.getParentId())) {
								menu = super.find(TCMenu.class, menu.getParentId());
								if(null != menu) {
									roleMenu = new TCRoleMenu();
									roleMenu.setMenuId(menu.getId());
									roleMenu.setRoleId(roleId);
									roleMenuMaps.put(menu.getId(), roleMenu);
								} else {
									isLoop = false;
								}
							} else {
								isLoop = false;
							}
						} else {
							isLoop = false;
						}
					}
				}//if
			}//for
			roleMenu = null;
			ArrayList<TCRoleMenu> lists = new ArrayList<TCRoleMenu>(roleMenuMaps.size());
			for (String key : roleMenuMaps.keySet() ) {
				lists.add(roleMenuMaps.get(key));
			}
			roleMenuMaps = null;
			if(lists.size()>0) {
				//保存角色菜单信息
				is = super.save(lists);//保存成功，保存角色菜单操作权限信息
			}
			lists = null;
		} else {
			throw new IllegalArgumentException("参数传递错误");
		}
		return is;
	}

	@Override
	public List<TCRoleMenu> queryByRole(String roleId) {
		return super.finds(Cnd.where(Exp.eq("roleId", roleId)));
	}

	@Override
	public boolean isRoleMenuRelateExist(String roleId, String menuId) {
		boolean is = false;
		if(StringUtils.isNotEmpty(roleId) && StringUtils.isNotEmpty(menuId)) {
			HashMap<String, Object> params = new HashMap<String, Object>();
			params.put("roleId", roleId);
			params.put("menuId", menuId);
			MixResponse<Long> mixResp = resQueryServ.count("check_role_menu_relate_exist", params);
			is = (IWebConstant.OP_SUCCESS.equals(mixResp.getResult()) && mixResp.getData()>0);
		}
		return is;
	}
	
}
